package cn.tedu;



import javax.swing.*;
import java.awt.*;
import java.util.Random;

//海洋对象
public abstract class SeaObject {
    public static final int LIVE=0;//活着
    public static final int DEAD=1;//死了
    protected int state =LIVE;//当前状态，默认是活着的

    protected int width;//宽
    protected int height;//高
    protected int x;//x坐标
    protected int y;//x坐标
    protected int speed;//移动速度
    /*
     * 为侦察艇,鱼雷艇,水雷艇提供的
     * 因为三种潜艇的宽高数据不一样，所以数据不能写死，需要传入参数
     * 但是因为三种潜艇的x坐标和y坐标还有移动速度speed是一样的，
     * 所以数据可以写死，不需要传参
     */
    public SeaObject(int width,int height){
        this.width=width;
        this.height=height;
        x = -width; //负的潜艇的宽
        Random rand = new Random(); //随机数对象
        y = rand.nextInt(World.HEIGHT-height-150+1)+150; //150到(窗口高-潜艇高)之间的随机数
        speed = rand.nextInt(3)+1; //1到3之间的随机数
    }

    /*
     *为战舰，水雷，深水炸弹提供的
     * 因为战舰，水雷，深水炸弹的 宽，高，x，y，speed都不一样，所以不能写死，需要传参
     */
    public SeaObject(int width,int height,int x,int y,int speed){
        this.width=width;
        this.height=height;
        this.x=x;
        this.y=y;
        this.speed=speed;
    }
    //海洋对象移动
    public abstract void move();

    //获取对象的图片
    public abstract ImageIcon getImage();

    //判断对象是否存活
    public boolean islive(){
        //如果 state==LIVE 返回true 则表示活着
        return state==LIVE;
    }
    //判断对象是否死掉了
    public boolean isDead(){
        //如果state==DEAD 返回true 则代表死了
        return state==DEAD;
    }

    //画对象
    public void paintImage(Graphics graphics){
        if (islive()){
            getImage().paintIcon(null,graphics,this.x,this.y);
        }
    }

    //检测潜艇是否越界
    public boolean isOutOfBounds(){
        //WIDTH为窗口的宽  如果潜艇的x>=WIDTH，表示越界
        return this.x>=World.WIDTH;
    }

    //检测碰撞 this 指一个对象，seaObjec 另一个对象
    public boolean isHit(SeaObject seaObject){
        //假设this 指的是潜艇，seaObjec指的是炸弹
        int x1 = this.x - seaObject.width;//潜艇的x-炸弹的宽
        int x2 = this.x + this.width; //潜艇的x+潜艇的宽
        int y1 = this.y - seaObject.height; //潜艇的y-炸弹的高
        int y2 = this.y + this.height; //潜艇的y+潜艇的高
        int x = seaObject.x; //炸弹的x
        int y =seaObject.y; //炸弹的y

        return  x>=x1 && x<=x2  && y>=y1  && y<=y2;
    }

    //让海洋对象去死
    public void goDead(){
        state=DEAD;//把对象的状态设置为死了的
    }

}


